package com.yungu.swift.lbs.service;


import com.yungu.swift.base.ResponseData;
import com.yungu.swift.lbs.model.DriverLocation;
import com.yungu.swift.lbs.model.DriverPoint;
import com.yungu.swift.lbs.model.OrderEventPoint;
import com.yungu.swift.lbs.model.dto.DriverWorkTimeDto;
import com.yungu.swift.lbs.model.vo.GeoVo;
import com.yungu.swift.lbs.model.vo.RegeoVo;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 位置信息服务Service
 * Created by cuixiuyin on 2018/12/7.
 */
public interface LocationService {

    /**
     * 上传并记录司机位置信息。
     *
     * @param uuid        司机UUID.
     * @param type        司机类型（出租车、专车、拼车等）
     * @param lng         位置经度
     * @param lat         位置纬度
     * @param distance    与上一点的距离
     * @param uploadTime  上传时间
     * @param orderUuid   订单UUID
     * @param angle       当前角度
     * @param appid       应用ID
     * @param orderStatus 订单状态
     * @param mileage     订单中累计距离
     * @param fee         订单中实时费用
     * @return AjaxList 成功信息
     **/
    ResponseData<Boolean> uploadDriverLocation(String uuid, int type, double lng, double lat, double distance,
                                               Date uploadTime, String orderUuid, double angle, String appid,
                                               int orderStatus, double mileage, double fee);

    /**
     * 上传并记录司机位置信息
     *
     * @param paramsMap map参数
     * @return AjaxList
     */
    ResponseData<Boolean> uploadDriverLocation(Map<String, Object> paramsMap);

    /**
     * 检索附近的司机Service.
     *
     * @param type     司机类型（出租车、专车、拼车等）
     * @param lng      经度
     * @param lat      纬度
     * @param appid    应用ID
     * @param distance 检索距离（单位：米）
     * @param maxNum   检索结果最大司机数
     * @return 附近的司机
     */
    ResponseData<List<DriverPoint>> geoNear(int type, double lng, double lat, String appid, int distance, int maxNum);

    /**
     * 检索在线的司机Service
     *
     * @param type     司机类型（出租车、专车、拼车等）
     * @param lng      经度
     * @param lat      纬度
     * @param appid    应用ID
     * @param distance 检索距离（单位：米）
     * @param maxNum   检索结果最大司机数
     * @return 附近的司机
     */
    ResponseData<List<DriverPoint>> geoNearOnline(int type, double lng, double lat, String appid, int distance, int maxNum);

    /**
     * 查找司机最新位置
     *
     * @param driverUuid 司机UUID
     * @param appid      应用ID
     * @return DriverPoint
     */
    ResponseData<DriverPoint> findDriverPoint(String driverUuid, String appid);

    /**
     * 查找司机最新位置
     *
     * @param driverUuid 司机UUID
     * @param appid      应用ID
     * @return DriverLocation
     */
    ResponseData<DriverLocation> findDriverLocation(String driverUuid, String appid);

    /**
     * 根据订单UUID查找该订单最新的位置信息
     *
     * @param orderUuid 订单UUID
     * @param appid     应用ID
     * @return DriverLocation
     */
    ResponseData<DriverLocation> findNewestOrderLocation(String orderUuid, String appid);

    /**
     * 根据订单UUID和positionType查找该订单最新的位置信息
     *
     * @param orderUuid    参数
     * @param positionType 参数
     * @param appid        参数
     * @return DriverLocation
     */
    ResponseData<DriverLocation> findOrderLocationByPositionType(String orderUuid, String positionType, String appid);

    /**
     * 根据订单UUID查找该订单地图点
     *
     * @param orderUuid 订单UUID
     * @param appid     应用ID
     * @return List
     */
    ResponseData<List<DriverLocation>> findOrderMapPoint(String orderUuid, String appid);

    /**
     * 根据司机ID查找当天轨迹
     *
     * @param driverUuid 司机UUID
     * @param appid      应用ID
     * @return List
     */
    ResponseData<List<DriverLocation>> findDriverTodayMapPoint(String driverUuid, String appid);

    /**
     * 获取司机在线时间
     *
     * @return List
     */
    ResponseData<List<DriverWorkTimeDto>> getWorkTimeList();

    /**
     * 获取所有最新司机Location点
     *
     * @param type    业务类型
     * @param carType carType
     * @param appid   appid
     * @return AjaxList
     */
    ResponseData<List<DriverLocation>> getAllNewsDriverPoint(int type, int carType, String appid);

    /**
     * 获取一个订单所有触发事件的点
     *
     * @param orderUuid 订单uuid
     * @return List
     */
    ResponseData<List<OrderEventPoint>> listOrderEventPoint(String orderUuid);


    /**
     * 根据司机uuid和当前触发的传点状态 获取到相对应的状态的所有的点。
     * 如 当前触发状态为司机出发去接乘客，则获取订单结束或者上班的最近的一次时间 到现在的所有的点
     *
     * @param driverUuid       参数
     * @param statsStatus      参数
     * @param currentOrderUuid 当前订单id
     * @param startTime        参数
     * @return Map
     */
    ResponseData<Map<String, Object>> getTodayLocationsByStatsStatus(String driverUuid, int statsStatus,
                                                                     String currentOrderUuid, Date startTime);

    /**
     * 复制最后一个点作为司机下班点
     *
     * @param driverUuid 参数
     * @return AjaxList
     */
    ResponseData<Boolean> copyLastPointAsOffWorkPoint(String driverUuid);

    /**
     * 获取范围内司机
     *
     * @param map 条件集合
     * @return AjaxList 响应对象
     * @author Zerrion
     * @date 2017/12/28
     */
    ResponseData<List<DriverPoint>> getScopeDriver(Map<String, Object> map);

    /**
     * 根据订单id和positionType取出定位点
     *
     * @param orderUuid    参数
     * @param positionType 参数
     * @return DriverLocation
     */
    ResponseData<DriverLocation> getOrderPointByPositionType(String orderUuid, String positionType);

    /**
     * 地理位置编码
     *
     * @param address
     * @return
     */
    ResponseData<GeoVo> geo(String address);

    /**
     * 【逆】地理位置编码
     *
     * @param lng
     * @param lat
     * @return
     */
    ResponseData<RegeoVo> regeo(Double lng, Double lat);

    /**
     * 根据经纬度获取地址
     *
     * @param lng
     * @param lat
     * @return
     */
    ResponseData<String> getAddress(Double lng, Double lat);

    /**
     * 高德 - 调用车辆轨迹查询接口获取行驶里程（单位：米）
     *
     * @param vehicleId 司机id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    ResponseData<Double> getDrivingDistance(String vehicleId, long startTime, long endTime);

    /**
     * 获取司机服务行程点
     *
     * @param orderUuid
     * @param appid
     * @return
     */
    ResponseData<List<DriverLocation>> findOrderDuringTheTripPoints(String orderUuid, String appid);

    /**
     * 批量获取排队中司机定位点
     *
     * @param paraMap
     * @return
     */
    ResponseData<Map<String, Object>> getQueueDriverLocation(Map<String, Object> paraMap);

    /**
     * 获取跨城司机行程开始所有点
     */
    ResponseData<List<DriverLocation>> getCrosstownOrderLocation(Map<String, Object> paraMap);

    /**
     * 获取预估路线
     * @return
     */
    ResponseData<String> getEstimateRoute(Double originLng, Double originLat, Double destLng, Double destLat);

    /**
     * 根据主单ID获取位置点
     *
     * @param mainOrderUuid
     * @return List
     */
    ResponseData<List<DriverLocation>> findMainOrderLocation(String mainOrderUuid);
}
